# -*- coding: latin-1 -*-
from BeautifulSoup import BeautifulSoup
import urllib, urllib2, sys

class Categoria(object):
    def __init__(self,classeGramatical):
        self.pos = classeGramatical
        self.definicoes = []

    def adicionaDefinicao(self, definicao):
        self.definicoes.append(definicao)
        
    def imprimeCategoria(self):
        print "Pos " + self.pos
        for definicao in self.definicoes:
            print "    " + definicao
        print " "


class Crawler(object):
    base_url = 'http://www.priberam.pt/dlpo/default.aspx?pal='
    
    def __init__(self, lista):
        self.lista = lista
            

    #generator
    def buscar(self):
        definicoes = []
        for palavra in self.lista:            
            req = urllib2.Request(self.base_url + palavra)
            response = urllib2.urlopen(req).read()
            response = response.decode('utf8')
            soup = BeautifulSoup(response)

            div = soup.find('div', {'id' : 'DivDefinicao'})

            varpb = div.findAll('span', {'class':'varpb'})

            for span in varpb:
                categoria = span.findAll('categoria_pb')
                tamanho = len(categoria)
                if tamanho > 0: #encontrou uma das classes gramaticais da palavra
                    classeGramatical = categoria[0].string
                    categoria = Categoria(classeGramatical)
                    flag = True
                    div = span
                    while flag == True:
                        div = div.findNext('div',{'style':'padding-left:12px;'})
                        definicao = div.find('span', {'ondblclick':'javascript:DefinePalavra(getSel());'})
                        explicacao = div.findAll('span', {'class':'varpb'})
                        tamanho = len(explicacao)
                        if tamanho > 0:
                            print 'possui explicacao'
                            explicacao = explicacao[0].findNext('span');
                            exp = explicacao.string
                            exp = exp.lstrip('\n\t ')                            
                            exp = exp.rstrip()
                            exp = exp.rstrip('\n')
                            definition = ''.join(definicao.findAll(text=True))
                            definicaoString = exp + " " + definition.lstrip('\n\t ').rstrip('\n\t ')
                            proximoSpan = definicao.findNext('span')
                            tam = len(proximoSpan.findAll('div', {'style':'padding-left:10px;'}))
                            if tam > 0: #fim da classe gramatical
                                print('condicao')
                                flag = False
                            else:
                                print 'tam de ' + str(tam)
                                proximos = definicao.findAllNext('div',{'style':'padding-left:12px;'})
                                if len(proximos) == 0:
                                   flag = False
                                
            
                        else:
                            definicaoString = definicao.string
                            proximoSpan = div.findAllNext('span')
                            if len(proximoSpan) > 0:
                                if len(proximoSpan[0].findAll('categoria_pb')) > 0:
                                    flag = False
                                proximos = definicao.findAllNext('span', {'ondblclick':'javascript:DefinePalavra(getSel());'})
                                if len(proximos) == 0:
                                    flag = False
                    else:
                        proximos = definicao.findAllNext('span', {'ondblclick':'javascript:DefinePalavra(getSel());'})
                        tamproximos = len(proximos)
                        if tamproximos == 0:
                            flag = False
                        categoria.adicionaDefinicao(definicaoString)
                    definicoes.append(categoria)
            
            #retorna a lista de definicoes
            yield definicoes
                
                        